package br.com.controlador;

import br.com.modelo.Caixa;
import br.com.modelo.Funcionario;
import br.com.modelo.Operador;
import java.io.Serializable;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import util.JPAUtil;

/**
 *
 * @author Gilberto
 */
@ManagedBean
@ViewScoped
public class OperadorControler implements Serializable {

    private Operador operador;
    private List<Operador> listOperadores = new ArrayList<Operador>();
    private String campoBusca = new String();
    //variavel de controle
    private Boolean alterando = false;

    @PostConstruct
    public void init() {
        operador = new Operador();
        listOperadores = Operador.retornaTodosOperadores();
    }

    /**
     * @return the campoBusca
     */
    public String getCampoBusca() {
        return campoBusca;
    }

    /**
     * @param campoBusca the campoBusca to set
     */
    public void setCampoBusca(String campoBusca) {
        this.campoBusca = campoBusca;
    }

    public void inicializaObj() {
        operador = new Operador();
        alterando = false;
    }

    public void alterar() {
        alterando = false;
    }

    public void salvar() {
        try {
            if (operador.getIdEcfFuncionario().getId().toString().equals("0")) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Selecione o funcionário!", "Mensagem"));
            } else if (operador.getIdEcfFuncionario().getNivelAutorizacao().toString().equals("0")) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Selecione o nível de acesso do operador!", "Mensagem"));
            } else {
                //salvando o nivel de autorizacao na tabela de funcionario
                Funcionario func = Funcionario.retornaFuncionarioPorId(operador.getIdEcfFuncionario().getId());
                func.setNivelAutorizacao(operador.getIdEcfFuncionario().getNivelAutorizacao());
                func = func.salvar();
                List<Caixa> caixa = CaixaControler.retornaCaixa();
                for (Caixa c : caixa) {
                    Connection con = JPAUtil.conectaBanco(c.getIp());
                    if (con != null) {
                        func = func.salvarCaixas(c.getIp());
                    }
                }

                if (!alterando) {
                    operador.setBloqueado('N');
                    operador.setExcluido('N');
                }
                operador = operador.salvar();
                listOperadores = Operador.retornaTodosOperadores();

                //retornando caixas e salvando nos caixas
                for (Caixa c : caixa) {
                    Connection con = JPAUtil.conectaBanco(c.getIp());
                    if (con != null) {
                        operador = operador.salvarCaixas(c.getIp());
                        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Transferido para caixa(" + c.getNome() + ")", "Mensagem"));
                    }
                }
            }
            org.primefaces.context.RequestContext.getCurrentInstance().execute("dlgAcessoFuncionario.hide();");
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Problema ao cadastrar o operador!!", "Mensagem"));
        }
    }

    public void excluir() {
        try {
            operador.setExcluido('S');
            operador = operador.salvar();
            listOperadores = Operador.retornaTodosOperadores();
            //retornando caixas e salvando nos caixas
            List<Caixa> caixa = CaixaControler.retornaCaixa();
            for (Caixa c : caixa) {
                Connection con = JPAUtil.conectaBanco(c.getIp());
                if (con != null) {
                    operador = operador.salvarCaixas(c.getIp());
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Transferido para caixa(" + c.getNome() + ")", "Mensagem"));
                }
            }
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Erro ao excluir operador!!", "Mensagem"));
        }
    }

    public void realizaBusca() {
        listOperadores = Operador.retornaBusca(campoBusca);
    }

    public void inicializaBusca() {
        campoBusca = new String();
    }

    /**
     * @return the operador
     */
    public Operador getOperador() {
        return operador;
    }

    /**
     * @param operador the operador to set
     */
    public void setOperador(Operador operador) {
        alterando = true;
        this.operador = operador;
    }

    /**
     * @return the listOperadores
     */
    public List<Operador> getListOperadores() {
        return listOperadores;
    }

    /**
     * @param listOperadores the listOperadores to set
     */
    public void setListOperadores(List<Operador> listOperadores) {
        this.listOperadores = listOperadores;
    }

    /**
     * @return the alterando
     */
    public Boolean getAlterando() {
        return alterando;
    }

    /**
     * @param alterando the alterando to set
     */
    public void setAlterando(Boolean alterando) {
        this.alterando = alterando;
    }

    public void bloqueiaDesbloqueia(Operador ope) {

        if (ope.getBloqueado().toString().equals("S")) {
            ope.setBloqueado('N');
        } else if (ope.getBloqueado().toString().equals("N")) {
            ope.setBloqueado('S');
        }
        ope = ope.salvar();
        //retornando caixas e salvando nos caixas
        List<Caixa> caixas = CaixaControler.retornaCaixa();
        for (Caixa c : caixas) {
            Connection con = JPAUtil.conectaBanco(c.getIp());
            if (con != null) {
                ope = ope.salvarCaixas(c.getIp());
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Transferido para caixa(" + c.getNome() + ")", "Mensagem"));
            }
        }
        listOperadores = Operador.retornaTodosOperadores();
    }
}
